/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


#ifndef _VECTORBITS_H_
#define _VECTORBITS_H_

#include <iostream>

 /**
 *@file VectorBits.h
 *@brief Interfaz para trabajar con vectores de bits
 *
 */

 /**
 * \class VectorBits
 *
 * \brief Modulo que representa un vector de bits
 *         
 * \author Mary Carmen Suárez 
 *
 */
	class VectorBits
	{
		private:
			unsigned char * v; //Vector donde se almacenan los bits
			int nbits; //Número de bits que componen el vector
			int reservados; //Número de elementos reservados
			/**
			@brief Redimensiona el vector
			@param n, tamaño que queremos que redimensione
			*/
			void Resize (int n);
			/**
			*@return el número de reservados del vector
			*/
			int GetReservados () const;
		public:
			/**
			@brief Constructor por defecto
			@pos inicializa todo a cero
			*/
			VectorBits();
			/**
			@brief Constructor con parametros
			@param valor, dato con el que queremos inicializar el vector de bits
			@param n, numero de bits con el que se va a inicializar el vector de bits
			*/
			VectorBits (int valor, int n);
			/**
			@brief Constructor de copia
			@param orig, tipo de dato que va a ser copiado
			*/
			VectorBits(const VectorBits & orig);
			/**
			@brief Destructor
			@pos libera toda la memoria reservada
			*/
			~VectorBits();
			/**
			@brief Operador de asignación
			@param orig, x=orig
			@return devuelve x con los valores de orig
			*/
			VectorBits & operator= (const VectorBits & orig);
			/**
			@brief Modifica un elemento del vector
			@param dato, modificación que queremos hacerle al vector
			@param pos, posición del vector que queremos modificar
			*/
			void SetVector (bool dato, int pos);
			/**
			@param pos, posición del vector que queremos modificar
			*@return devuelve el contenido del vector en la posición pos
			*/
			bool GetVector (int pos) const;
			/**
			*@return el número de bits utilizados en el vector
			*/
			int GetNbits () const;
			/**
			@brief Operador de igualdad
			@param orig x == orig
			@return devuelve si dos objetos VectorBits son iguales bit a bit
			*/
			bool operator== (const VectorBits & orig) const;
			/**
			@brief Operador de desigualdad
			@param orig    *this != orig
			@return devuelve si dos objetos VectorBits no son iguales bit a bit
			*/
			bool operator!= (const VectorBits & orig) const;
			/**
			@brief Operador +=, añade un tipo bool a la secuencia de bits.
			@param dato, vector+=dato
			@return devuelve vector con su modificación hecha
			*/
			VectorBits & operator+= (bool dato);
			/**
			@brief Operador +=, concatena dos vectores de bits
			@param dato, vector+=vector1
			@return devuelve vector con su modificación hecha
			*/
			VectorBits & operator+= (const VectorBits & orig);
			/**
			@brief función que invierte los bits de un vector
			@pos el vector queda invertido
			*/
			void Invertir();
			/**
			@brief función que salva los datos en bytes
			*/
			void Salvar (std :: ostream & os);
			/**
			@brief función que lee los datos en bytes
			*/
			void Leer (std :: istream & is, unsigned int tam);
			/**
			@brief Funcion que calcula el numero entero de un vector de bits (binario)
			@return devuelve dicho calculo
			*/
			int NumeroEntero ();

};

std :: ostream & operator<< (std::ostream& os, const VectorBits & vector);
std :: istream & operator>> (std::istream& is, VectorBits & vector);

#endif
